package com.zhongkai.service.declare;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.zhongkai.dao.declare.DeclareDAO;
import com.zhongkai.model.book.TCsCcsjs;
import com.zhongkai.model.book.TDjCcdjxx;
import com.zhongkai.model.book.TDjCcdjxxLs;
import com.zhongkai.model.book.TDjCcjmxx;
import com.zhongkai.model.book.TDjCcywcl;
import com.zhongkai.model.book.TDjNsrxx;
import com.zhongkai.model.code.TCsZspm;
import com.zhongkai.model.config.User;
import com.zhongkai.model.declare.TSbCcssbxx;
import com.zhongkai.model.declare.TSbCcsspxx;
import com.zhongkai.model.ticket.TPzJc;
import com.zhongkai.model.ticket.TPzYwls;
import com.zhongkai.service.BaseService;
import com.zhongkai.tools.DateTool;

@Component
@Transactional
public class DeclareService extends BaseService {

	private DeclareDAO declareDAO;

	@Resource
	public void setDeclareDAO(DeclareDAO declareDAO) {
		this.declareDAO = declareDAO;
	}
	
	/**
	 * 根据申报起始年得出计税年度
	 * @author 梁文敏
	 * @param sbqsn 申报起始年
	 * **/
	private int getJsnd(int sbqsn) throws Exception{
		List taxYearList=declareDAO.select("select jsnd from TCsCcsjsndqj where cast(ndxx as integer) < ? and ? <= cast(ndsx as integer) ",new Object[]{sbqsn,sbqsn});
		return Integer.parseInt(taxYearList.get(0).toString());
	}
	
	/**
	 * 根据纳税年度及车船类型得出车船税计税参数
	 * @author 梁文敏
	 * @param nsnd	纳税年度
	 * @param swcclxDm	车船类型代码（税务局提供）
	 * **/
	
	private TCsCcsjs getCcsjs(String nsnd,String swcclxDm) throws Exception{
		List list=declareDAO.select("from TCsCcsjs where nsnd=? and swcclxDm=?", new Object[]{nsnd,swcclxDm});
		return (TCsCcsjs)list.get(0);
	}
	
	private TCsZspm getZspm(String zspmDm) throws Exception{
		return (TCsZspm)declareDAO.selectById(TCsZspm.class, zspmDm);
	}
	
	/**
	 * 根据计税参数表中的计税依据、需交税的月数得出计税依据、应缴税额
	 * @author 梁文敏
	 * @param ccdjxx 车船登记信息
	 * @param ccsjs 车船税计税参数
	 * @param monthRatio 根据一年12个月，减去当前月份，得出当前需缴纳几个月的税额，再除12得出的对比率
	 * **/
	private double[] jsyj_yjsJe(TDjCcdjxx ccdjxx,TCsCcsjs ccsjs,double monthRatio) throws Exception{
		double yjsJe=0;
		double jsyj=1;
		if(ccsjs.getJsyjsx().equals("HDZZL")){	//判断计税依据是否为核定载重量
			jsyj=ccdjxx.getHdzzl();
			yjsJe=jsyj*ccsjs.getSl();	//应缴税额=核重载重量 * 税率
		}
		else if(ccsjs.getJsyjsx().equals("ZBZL")){	//判断计税依据是否为整备质量
			jsyj=ccdjxx.getZbzl();
			yjsJe=jsyj*ccsjs.getSl();	//应缴税额=整备质量 * 税率
		}
		else{	//如果计税依据的值为空，则表示计税依据为“1”
			jsyj=1;
			yjsJe=jsyj*ccsjs.getSl();	//应缴税额=1 * 税率
		}
		yjsJe=yjsJe*monthRatio;	//需要交几个月的税额
		return new double[]{jsyj,yjsJe};
	}
	
	/**
	 * 计算滞纳金
	 * @author 梁文敏
	 * @param startTime=纳税年份的开始时间
	 * @param endTime=纳税年份的结束时间
	 * @param amount=纳税年份实际税额
	 * **/
	private double getZnj(Date endTime,Date today,double amount) throws Exception{
		double znj=0;
		Date tempDate=DateTool.parse("2001-05-01", "yyyy-MM-dd");
		if(endTime.before(tempDate)){	//若在2001年5月1日之前
			long befortDiffDay=DateTool.dateDiff(endTime, tempDate, "nd")-1;
			long afterDiffDay=DateTool.dateDiff(tempDate, today, "nd")+1;
			znj=amount*befortDiffDay*0.002+amount*afterDiffDay*0.0005;		//滞纳金=当年实际税额*2001年5月1日之前的天数*0.002+当年实际税额*2001年5月1日之后的天数（包括5月1日）*0.0005
		}
		else if(endTime.after(tempDate) || endTime.compareTo(tempDate)==0){	//若在2001年5月1日之后包括5月1日当天
			long day=DateTool.dateDiff(endTime, today, "nd");	//计算滞纳天数
			znj=amount*day*0.0005;	//滞纳金=当年实际税额*滞纳天数*0.0005
		}
		return znj;
	}
	
	/**
	 * 根据车船登记号查询该车的减免信息
	 * @author 梁文敏
	 * @param ccdjh=年税登记号
	 * **/
	private List getJmxxList(Integer ccdjh) throws Exception{
		List list=declareDAO.select("from TDjCcjmxx where ccdjh=?", ccdjh);
		return list;
	}
	
	/**
	 * 根据纳税年份获取减免类型与减免金额
	 * @author 梁文敏
	 * @param jmxxList=该车船登记号的所有减免信息
	 * @param endTime=纳税年份的结束时间
	 * @param amount=纳税年份实际税额
	 * @param yjsJe=应缴税金额
	 * 1、如果“免税标识”为真，且处于有效期内，则“减免税额”为“应缴税额”
	 * 2、减免税金额=减免幅度*应缴税金额
	 * 3、减免税金额=减免额度金额-应缴各金额>=0?应缴税金额:减免额度金额
	 * **/
	private Object[] ccjmxx_jmsJe_jmxx(List jmxxList,Date startTime,Date endTime,double yjsJe) throws Exception{
		TDjCcjmxx jmxx=null;	//减免序号
		Double jmsJe=null;		//实际减免税金额
		int startTime2Int=DateTool.GetDate2Int(startTime);		//纳税年份开始时间
		int endTime2Int=DateTool.GetDate2Int(endTime);		//纳税年份结束时间
		for(int i=0;i<jmxxList.size();i++){
			TDjCcjmxx ccjmxx=(TDjCcjmxx)jmxxList.get(i);
			int ssqqRq2Int=DateTool.GetDate2Int(ccjmxx.getSsqqRq());	//减免信息所属时期
			int ssqzRq2Int=DateTool.GetDate2Int(ccjmxx.getSsqzRq());	//减免信息结束时间
			if(startTime2Int >= ssqqRq2Int && endTime2Int <= ssqzRq2Int){	//	如果纳税年份符合减免范围
				if(ccjmxx.getMsBj().equals("y") || ccjmxx.getMsBj().equals("Y")){	//判断是否免税
					jmxx=ccjmxx;	//设置当前减免信息
					jmsJe=yjsJe;	//如果免税，且处于有效期内，则“减免税额”为“应缴税额”
					return new Object[]{jmxx,jmsJe,jmxxList};	//返回减免信息为免税的减免序号及减免税额
				}
				else{
					double temp=0;	//临时减免税金额
					if(ccjmxx.getJmfsDm().equals("01")){	//幅度减免
						temp=yjsJe*ccjmxx.getJmfd();	//临时减免税金额=减免幅度*应缴税金额
						if(jmsJe==null){
							jmxx=ccjmxx;	//设置当前减免信息
							jmsJe=temp;
						}
						else{
							if(jmsJe.doubleValue()>temp){
								jmxx=ccjmxx;	//设置当前减免信息
								jmsJe=temp;
							}
						}
					}
					else if(ccjmxx.getJmfsDm().equals("02") && ccjmxx.getJmedJe().doubleValue()>0){	//额度减免
						temp=ccjmxx.getKjmJe()-yjsJe>=0?yjsJe:ccjmxx.getKjmJe();	//临时减免税金额=可减免额度金额-应缴各金额>=0?应缴税金额:可减免额度金额
						if(jmsJe==null){
							jmxx=ccjmxx;	//设置当前减免信息
							jmsJe=temp;
							ccjmxx.setJmedJe(ccjmxx.getKjmJe()-jmsJe);		//该条减免信息额度减免发生变化
							jmxxList.set(i, ccjmxx);	//更新额度减免信息
						}
						else{
							if(jmsJe.doubleValue()>temp){
								jmxx=ccjmxx;	//设置当前减免信息
								jmsJe=temp;
								ccjmxx.setJmedJe(ccjmxx.getKjmJe()-jmsJe);		//该条减免信息额度减免发生变化
								jmxxList.set(i, ccjmxx);	//更新额度减免信息
							}
						}
					}
				}
			}
		}
		if(jmxx!=null && jmsJe!=null)
			return new Object[]{jmxx,jmsJe,jmxxList};
		return null;
	}
	
	/**
	 * 根据车船登记信息及所属期止（申报截止年月）得出申报资料
	 * @author 梁文敏
	 * @param ccdjxx 车船登记信息
	 * @param ssqzRq 所属期止
	 * **/
	public List getDeclareList(TDjCcdjxx ccdjxx,Date ssqzRq) throws Exception{
		Date ssqqRq=DateTool.parse(ccdjxx.getSbqsny(), "yyyyMM");	//所属期起（申报起码年月）
		Date today=DateTool.getCurrentDate("yyyy-MM-dd");	//今天年月日，用于判断是否需要缴交滞纳金
		Calendar ssqqRqCalendar=Calendar.getInstance();Calendar ssqzRqCalendar=Calendar.getInstance();Calendar todayCalendar=Calendar.getInstance();
		ssqqRqCalendar.setTime(ssqqRq);ssqzRqCalendar.setTime(ssqzRq);todayCalendar.setTime(today);
		List declarelist=new ArrayList();
		List jmxxList=this.getJmxxList(ccdjxx.getCcdjh());		//根据车船登记号查询该车的减免信息
		while(ssqqRqCalendar.get(Calendar.YEAR) <= ssqzRqCalendar.get(Calendar.YEAR)){	//纳税申报期内按每年循环
			int jsnd=this.getJsnd(ssqqRqCalendar.get(Calendar.YEAR));	//计税年度
			TCsCcsjs ccsjs=this.getCcsjs(String.valueOf(jsnd),ccdjxx.getSwcclxDm());	//车船税计税参数
			TCsZspm zspm=this.getZspm(ccsjs.getZspmDm());	//征收品目参数
			double monthRatio=1;
			if(ssqqRqCalendar.get(Calendar.YEAR) < ssqzRqCalendar.get(Calendar.YEAR)){
				monthRatio=(12-ssqqRqCalendar.get(Calendar.MONTH))/(double)12;	//根据一年12个月，减去当前月份，得出当前需缴纳几个月的税额，再除12得出百分比
			}
			else{
				monthRatio=(ssqzRqCalendar.get(Calendar.MONTH)-ssqqRqCalendar.get(Calendar.MONTH)+1)/(double)12;	//根据一年12个月，申报期止减去当年申报期起，得出当前需缴纳几个月的税额，再除12得出百分比
			}
			double[] jsyj_yjsJe=this.jsyj_yjsJe(ccdjxx, ccsjs, monthRatio);	//根据计税参数表中的计税依据、需交税的月数得出计税依据、应缴税额
			double znj=0;	//滞纳金
			TDjCcjmxx ccjmxx=null;		//减免类型代码
			double jmsJe=0;		//减免税金额
			Date end=ssqzRq;	//每年的所属期止，若是今年，所属期止等于申报时间止，否则，所属期止等于每年的12月31日
			Object[] ccjmxx_jmsJe_jmxx=null;	//0：减免序号，1：减免各金额，2：减免信息列表
			if(ssqqRqCalendar.get(Calendar.YEAR) < todayCalendar.get(Calendar.YEAR)){		//是否需要缴交滞纳金
				if(ssqqRqCalendar.get(Calendar.YEAR) < ssqzRqCalendar.get(Calendar.YEAR))
					end=DateTool.parse(ssqqRqCalendar.get(Calendar.YEAR)+"-12-31", "yyyy-MM-dd");
				znj=this.getZnj(end, today, jsyj_yjsJe[1]);	//计算滞纳金
			}
			if(jmxxList!=null && jmxxList.size()>0)
				ccjmxx_jmsJe_jmxx=this.ccjmxx_jmsJe_jmxx(jmxxList, ssqqRq, end,  jsyj_yjsJe[1]);
			if(ccjmxx_jmsJe_jmxx!=null){
				ccjmxx=(TDjCcjmxx)ccjmxx_jmsJe_jmxx[0];
				jmsJe=(Double)ccjmxx_jmsJe_jmxx[1];
				jmxxList=(List)ccjmxx_jmsJe_jmxx[2];
			}
			Map declare=new HashMap();
			declare.put("ccdjh", ccdjxx.getCcdjh());	//车船登记号
			declare.put("sbfsDm", "01");	//申报方式
			declare.put("zsxmDm", zspm.getZsxmDm());	//征收项目代码
			declare.put("zspmDm",zspm.getZspmDm());		//征收品目代码
			declare.put("ssqqRq", ssqqRq);	//所属期起
			declare.put("ssqzRq",end);	//所属期止
			declare.put("sbqxRq", DateTool.parse(ssqqRqCalendar.get(Calendar.YEAR)+"-12-31", "yyyy-MM-dd"));	//申报期限
			declare.put("jkqxRq", DateTool.parse(ssqqRqCalendar.get(Calendar.YEAR)+"-12-31", "yyyy-MM-dd"));	//缴款期限
			declare.put("jsyj",jsyj_yjsJe[0]);	//计税依据
			declare.put("sl",ccsjs.getSl());	//税率、单位税额
			declare.put("yjsJe", jsyj_yjsJe[1]);	//应缴税金额
			declare.put("jmXh", ccjmxx==null?null:ccjmxx.getJmXh());	//车船减免信息序号
			declare.put("jmlxDm", ccjmxx==null?null:ccjmxx.getJmlxDm());	//减免类型代码
			declare.put("jmsJe", jmsJe);	//减免税金额
			declare.put("znjBj", znj>0?"Y":"N");	//滞纳金标记
			declare.put("znj", znj);	//滞纳金
			declarelist.add(declare);
			ssqqRqCalendar.set(ssqqRqCalendar.get(Calendar.YEAR)+1, 0, 1);	//所属时期起设置为下一年的1月1日
			ssqqRq=ssqqRqCalendar.getTime();
		}
		return declarelist;
	}
	
	private TPzJc getPzJc(Integer jcXh) throws Exception{
		return (TPzJc)declareDAO.selectById(TPzJc.class, jcXh);
	}
	
	private TDjNsrxx getNsrxx(String nsrbm) throws Exception{
		return (TDjNsrxx)super.getSingle(TDjNsrxx.class, "nsrbm", nsrbm);
	}
	
	private TDjCcjmxx getJmxx(Integer jmXh) throws Exception{
		return (TDjCcjmxx)declareDAO.selectById(TDjCcjmxx.class, jmXh);
	}
	
	/**
	 * 保存车船税申报信息
	 * **/
	
	public void save(List declarelist,User user,TDjCcdjxx ccdjxx,Integer jcXh,Date ssqzRq) throws Exception{
		Date date=new Date();
		TPzJc pzJc=this.getPzJc(jcXh);	//票证结存
		
		/**插入车船税税票信息**/
		TSbCcsspxx spxx=new TSbCcsspxx();	//车船税税票信息
		spxx.setSpXh(null);
		spxx.setPzzlDm("01");	//票证种类代码
		spxx.setZb(pzJc.getZb());			//字别
		spxx.setSphm(pzJc.getSphmQ());		//税票号码
		spxx.setPzztDm("02");	//票证状态
		spxx.setNsrbm(ccdjxx.getNsrbm());	//纳税人编码
		TDjNsrxx nsrxx=this.getNsrxx(ccdjxx.getNsrbm());	//纳税人信息
		spxx.setNsrMc(nsrxx==null?ccdjxx.getCzMc():nsrxx.getNsrmc());	//纳税人名称
		spxx.setKpRq(date);	//开票日期
		spxx.setCzrDm(user.getUserIdentifier());			//操作人
		spxx.setCzRq(date);								//操作时间
		spxx.setXgrDm(user.getUserIdentifier());		//修改人
		spxx.setXgRq(date);								//修改时间
		declareDAO.insert(spxx);	//保存车船税税票信息
		
		for(int i=0;i<3 && i<declarelist.size();i++){
			Map declare=(Map)declarelist.get(i);
			TSbCcssbxx sbxx=new TSbCcssbxx();
			sbxx.setSbXh(null);
			sbxx.setCcdjh((Integer)declare.get("ccdjh"));	//车船登记号
			sbxx.setSbfsDm((String)declare.get("sbfsDm"));	//申报方式
			sbxx.setZsxmDm((String)declare.get("zsxmDm"));	//征收项目代码
			sbxx.setZspmDm((String)declare.get("zspmDm"));	//征收品目代码
			sbxx.setSsqqRq((Date)declare.get("ssqqRq"));	//所属期起
			sbxx.setSsqzRq((Date)declare.get("ssqzRq"));	//所属期止
			sbxx.setSbqxRq((Date)declare.get("sbqxRq"));	//申报期限
			sbxx.setJkqxRq((Date)declare.get("jkqxRq"));	//缴款期限
			sbxx.setJsyj((Double)declare.get("jsyj"));		//计税依据
			sbxx.setSl((Double)declare.get("sl"));			//税率、单位税额
			sbxx.setYjsJe((Double)declare.get("yjsJe"));	//应缴税金额
			sbxx.setJmlxDm((String)declare.get("jmlxDm"));	//减免类型代码
			sbxx.setJmsJe((Double)declare.get("jmsJe"));	//减免税金额
			sbxx.setYbtJe(sbxx.getYjsJe()-sbxx.getJmsJe());	//应补退金额
			sbxx.setSpXh(spxx.getSpXh());					//税票序号
			sbxx.setCzrDm(user.getUserIdentifier());		//操作人
			sbxx.setCzRq(date);								//操作时间
			sbxx.setXgrDm(user.getUserIdentifier());		//修改人
			sbxx.setXgRq(date);								//修改时间
			declareDAO.insert(sbxx);	//保存申报信息
			String znjBj=(String)declare.get("znjBj");
			if(znjBj.equals("Y") || znjBj.equals("y")){		//滞纳金
				TSbCcssbxx znjSbxx=new TSbCcssbxx();
				znjSbxx.setSbXh(null);
				znjSbxx.setCcdjh((Integer)declare.get("ccdjh"));	//车船登记号
				znjSbxx.setSbfsDm((String)declare.get("sbfsDm"));	//申报方式
				znjSbxx.setZsxmDm((String)declare.get("zsxmDm"));	//征收项目代码
				znjSbxx.setZspmDm((String)declare.get("zspmDm"));	//征收品目代码
				znjSbxx.setSsqqRq((Date)declare.get("ssqqRq"));		//所属期起
				znjSbxx.setSsqzRq((Date)declare.get("ssqzRq"));		//所属期止
				znjSbxx.setSbqxRq((Date)declare.get("sbqxRq"));		//申报期限
				znjSbxx.setJkqxRq((Date)declare.get("jkqxRq"));		//缴款期限
				znjSbxx.setJsyj((Double)declare.get("yjsJe"));		//计税依据
				znjSbxx.setSl(0.0005);								//税率、单位税额
				znjSbxx.setYjsJe((Double)declare.get("znj"));		//应缴税金额
				znjSbxx.setZnjBj((String)declare.get("znjBj"));		//滞纳金标记
				znjSbxx.setYbtJe((Double)declare.get("znj"));		//应补退金额
				znjSbxx.setSpXh(spxx.getSpXh());					//税票序号
				znjSbxx.setCzrDm(user.getUserIdentifier());			//操作人
				znjSbxx.setCzRq(date);								//操作时间
				znjSbxx.setXgrDm(user.getUserIdentifier());			//修改人
				znjSbxx.setXgRq(date);								//修改时间
				declareDAO.insert(znjSbxx);	//保存带纳金申报信息
			}
			if(declare.get("jmXh")!=null){
				TDjCcjmxx jmxx=this.getJmxx((Integer)declare.get("jmXh"));
				if(jmxx!=null && jmxx.getJmfsDm()!=null && jmxx.getJmfsDm().equals("02")){
					jmxx.setKjmJe(jmxx.getKjmJe()-sbxx.getJmsJe());	//可减免金额
					jmxx.setYijmJe(jmxx.getYijmJe()+sbxx.getJmsJe());	//已减免金额
					declareDAO.update(jmxx);	//更新车船减免信息
				}
			}
		}
		
		/**车船业务处理-申报**/
		TDjCcywcl ccywcl=new TDjCcywcl();	//业务处理
		BeanUtils.copyProperties(ccdjxx, ccywcl);
		ccywcl.setYwclXh(null);
		ccywcl.setYwlxDm("06");		//业务处理06-申报
		ccywcl.setSbRq(date);	//申报时间
		ccywcl.setCzrDm(user.getUserIdentifier());			//操作人
		ccywcl.setCzRq(date);								//操作时间
		ccywcl.setXgrDm(user.getUserIdentifier());			//修改人
		ccywcl.setXgRq(date);								//修改时间
		declareDAO.insert(ccywcl);		//保存当前记录的业务处理信息，“业务处理代码”为“申报”
		
		/**车船历史记录**/
		TDjCcdjxxLs ccdjxxLs=new TDjCcdjxxLs();	//历史
		BeanUtils.copyProperties(ccdjxx, ccdjxxLs);
		ccdjxxLs.setCcdjlsXh(null);
		ccdjxxLs.setYwclXh(ccywcl.getYwclXh());		//业务处理序号
		ccdjxxLs.setCzrDm(user.getUserIdentifier());			//操作人
		ccdjxxLs.setCzRq(date);								//操作时间
		ccdjxxLs.setXgrDm(user.getUserIdentifier());			//修改人
		ccdjxxLs.setXgRq(date);								//修改时间
		declareDAO.insert(ccdjxxLs);	//原车船登记信息备份到CCDJXX_LS表中
		
		/**更新车船申报起始年月**/
		Date sbqsRq=DateTool.parse(ccdjxx.getSbqsny(), "yyyyMM");
		Calendar sbqsCalendar=Calendar.getInstance();Calendar ssqzCalendar=Calendar.getInstance();
		sbqsCalendar.setTime(sbqsRq);ssqzCalendar.setTime(ssqzRq);
		if(declarelist.size()>3){
			sbqsCalendar.set(sbqsCalendar.get(Calendar.YEAR)+3, 0, 1);	//新的申报日期为当前车船申报日期的三年后的1月1日
		}
		else{
			sbqsCalendar=ssqzCalendar;
			sbqsCalendar.set(Calendar.MONTH, sbqsCalendar.get(Calendar.MONTH)+1);	//新的申报日期为申报时间止的下一个月
		}
		sbqsRq=sbqsCalendar.getTime();
		ccdjxx.setSbqsny(DateTool.formatDate(sbqsRq, "yyyyMM"));
		declareDAO.update(ccdjxx);
		
		TPzYwls pzYwls=new TPzYwls();	//票证业务流水
		BeanUtils.copyProperties(pzJc, pzYwls);
		pzYwls.setYwlsXh(null);
		pzYwls.setPzztDm("02");		//票证状态-填用
		pzYwls.setYwlxDm("02");		//业务流水-填用
		pzYwls.setSphmZ(pzYwls.getSphmQ());		//税票号码止等于税票号码起
		pzYwls.setSl(1);	//数量
		pzYwls.setCzrDm(user.getUserIdentifier());	//操作人
		pzYwls.setCzRq(date);	//操作时间
		pzYwls.setXgrDm(user.getUserIdentifier());	//修改人
		pzYwls.setXgRq(date);	//修改时间
		declareDAO.insert(pzYwls);	//插入票证业务流水
		Integer sphmQ=Integer.valueOf(pzJc.getSphmQ());
		Integer sphmZ=Integer.valueOf(pzJc.getSphmZ());
		if(sphmQ<sphmZ){
			pzJc.setSphmQ(super.AddZero(sphmQ+1));	//增加当前操作员的税票起始号码
			declareDAO.update(pzJc);
		}
		else{
			declareDAO.delete(pzJc);	//删除票证结存信息
		}
	}
	
	//作废税票
	public void invalidateTicket(Integer jcXh,User user) throws Exception{
		Date date=new Date();
		TPzJc pzJc=this.getPzJc(jcXh);	//票证结存
		TPzYwls pzYwls1=new TPzYwls();	//票证业务流水
		BeanUtils.copyProperties(pzJc, pzYwls1);
		pzYwls1.setYwlsXh(null);
		pzYwls1.setPzztDm("02");		//票证状态-填用
		pzYwls1.setYwlxDm("02");		//业务流水-填用
		pzYwls1.setSphmZ(pzYwls1.getSphmQ());		//税票号码止等于税票号码起
		pzYwls1.setSl(1);	//数量
		pzYwls1.setCzrDm(user.getUserIdentifier());	//操作人
		pzYwls1.setCzRq(date);	//操作时间
		pzYwls1.setXgrDm(user.getUserIdentifier());	//修改人
		pzYwls1.setXgRq(date);	//修改时间
		declareDAO.insert(pzYwls1);	//插入票证业务流水
		
		TPzYwls pzYwls2=new TPzYwls();	//票证业务流水
		BeanUtils.copyProperties(pzJc, pzYwls2);
		pzYwls2.setYwlsXh(null);
		pzYwls2.setPzztDm("03");		//票证状态-填用
		pzYwls2.setYwlxDm("03");		//业务流水-填用
		pzYwls2.setSphmZ(pzYwls2.getSphmQ());		//税票号码止等于税票号码起
		pzYwls2.setSl(1);	//数量
		pzYwls2.setCzrDm(user.getUserIdentifier());	//操作人
		pzYwls2.setCzRq(date);	//操作时间
		pzYwls2.setXgrDm(user.getUserIdentifier());	//修改人
		pzYwls2.setXgRq(date);	//修改时间
		declareDAO.insert(pzYwls2);	//插入票证业务流水
		
		Integer sphmQ=Integer.valueOf(pzJc.getSphmQ());
		Integer sphmZ=Integer.valueOf(pzJc.getSphmZ());
		if(sphmQ<sphmZ){
			pzJc.setSphmQ(super.AddZero(sphmQ+1));	//增加当前操作员的税票起始号码
			declareDAO.update(pzJc);
		}
		else{
			declareDAO.delete(pzJc);	//删除票证结存信息
		}
	}
	
	//取票
	public TPzJc getPzJc(User user) throws Exception{
		List list=declareDAO.select("from TPzJc where pzzlDm='01' and sphmQ <= sphmZ and yprDm="+user.getUserIdentifier()+" order by zb,sphmQ", 1, 1);
		if(list!=null && list.size()>0){
			return (TPzJc)list.get(0);
		}
		return null;
	}
	
}
